package com.ssm.user.designPattern.strategyPattern.demo;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;


import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class PayFactory implements InitializingBean {
    @Resource //和@AutoWired一样都可获取接口的实现类(实现类也要加@Component注解)
    private List<PayHandle> payHandleList;

    private Map<PayChannelEnum, PayHandle> handleMap = new HashMap<>();

    public PayHandle getHandleByCode(int code) {
        PayChannelEnum payChannelEnum = PayChannelEnum.getByCode(code);
        return handleMap.get(payChannelEnum);
    }

    //凡是继承InitializingBean接口的类，在bean的属性初始化后都会执行该方法
    @Override
    public void afterPropertiesSet() throws Exception {
        /**
         * 我们要根据code值获取到对应的支付类
         * 已知我们根据code值可得到对应枚举对象(code, desc)
         *
         * 我们做到 根据枚举对象获取对应支付方法，那么我们需要map(枚举对象，支付方法)
         * 而支付方法类中可以获取到对应的枚举对象，所以我们要先得到支付方法类的集合，遍历做映射
         */
        for(PayHandle payHandle : payHandleList) {
            handleMap.put(payHandle.getChannel(), payHandle);
        }
    }
}
